/*
 * Ant Colony Optimization
 * Alex Oliveira
 * Heitor Luiz
 */

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "comum.h"
#include "exemplos.h"
#include "replace.h"

static int qtdformigas = 0;


/*
 * Inicializa o terreno.
 */
void init_terreno(int n) {
	init_exemplo(n);
}


/*
 * Libera o arquivo do terreno.
 */
void end_terreno() {
	fclose(terreno.vrml);
}


/*
 * Abre um arquivo VRML para uma nova formiga e já começa a escrever o arquivo.
 */
FILE *init_formiga(int n) {
	if (n == qtdformigas + 1) {
		qtdformigas++;
	}
	char str[20] = "";
	sprintf(str, "formiga%d", n);
	FILE *f = fopen(str, "w+");
	fprintf(f, "%d 0 %d", terreno.formigueiro.x, terreno.formigueiro.y);
	return f;
}


/*
 * Cria uma string bem grande com as frações de tempo para o arquivo VRML, de
 * acordo com a quantidade de passos que as formigas deram.
 */
char *fracoes() {
	int qtdpassos = turnos * MAX_CAMINHO * 2;
	char *txt = calloc(qtdpassos * 13, sizeof(char));
	float passo = 1.0 / qtdpassos;
	char aux[20];
	for (int i = 0; i < qtdpassos; i++) {
		sprintf(aux, "%f ", i * passo);
		strcat(txt, aux);
	}
	return txt;
}


/*
 * Faz as substituições dos tokens no arquivo de formiga e grava o resultado já
 * no arquivo definitivo. Fecha todos os arquivo envolvidos.
 */
// TODO: implementar
void end_formiga(Formiga *formiga) {
	char *txt = file2string(formiga->vrml);
	char *tps = fracoes();
	fseek(formiga->vrml, 0, SEEK_SET);
	FILE *arqtemplate = fopen("templates/formiga.txt", "r");
	if (arqtemplate == NULL) {
		fputs("Não foi possível abrir o arquivo de template da formiga (função end_formiga).", stderr);
	}
	char *olds[] = { "<posicao>", "<tempos>", "<coordenadas>", "<aparencia>",
			"<sensor>", "<tempo>", "<posicao2>", "<aparencia2>", "<sensor2>",
			"<posicao3>", "<sensor3>" };
	char posicaox[20] = "";
	sprintf(posicaox, "posicao%d", formiga->id);
	char aparenciax[20] = "";
	sprintf(aparenciax, "aparencia%d", formiga->id);
	char sensorx[20] = "";
	sprintf(sensorx, "sensor%d", formiga->id);
	char *news[] = { posicaox, tps, txt, aparenciax, sensorx, "300",
			posicaox, aparenciax, sensorx, posicaox, sensorx };
	frep(arqtemplate, formiga->vrml, 11, olds, news);
	fclose(arqtemplate);
	fclose(formiga->vrml);
	free(txt);
	free(tps);
}


void junta_arquivos() {
	fseek(terreno.vrml, 0, SEEK_SET);
	FILE *final = fopen("aco.wrl", "w");
	for (;;) {
		char ch = getc(terreno.vrml);
		if (ch == EOF) break;
		putc(ch, final);
	}
	for (int i = 0; i < qtdformigas; i++) {
		char nomearq[30];
		sprintf(nomearq, "formiga%d", i);
		FILE *f0 = fopen(nomearq, "r");
		if (f0 == NULL) break;
		for (;;) {
			char ch = getc(f0);
			if (ch == EOF) break;
			putc(ch, final);
		}
		fclose(f0);
	}
	fclose(final);
}

void grava_passo(Formiga *formiga) {
	fprintf(formiga->vrml, ", %d 0 %d", formiga->x, formiga->y);
}
